package com.jihu.sharding.algorithm;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.math.BigInteger;
import java.util.Collection;

/**
 * standard策略之自定义数据源精确分片算法类
 *
 * 执行比如 select * from course where cid = ? or cid in (?,?)
 */
public class MyPreciseDSShardingAlgorithm implements PreciseShardingAlgorithm<Long> {

    /**
     * 数据源精确分片算法
     * @param availableTargetNames 所有的真实数据源名称集合
     * @param shardingValue 过滤条件
     * @return 需要查询的数据源名称
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        // 获取逻辑表名称
        String logicTableName = shardingValue.getLogicTableName();
        // 获取分片键 / 过滤字段名称
        String cid = shardingValue.getColumnName();
        // 分片键 / 过滤字段的值
        Long cidValue = shardingValue.getValue();

        //实现算法思路还是这个表达式： m_$->{cid%2+1)
        BigInteger shardingValueB = BigInteger.valueOf(cidValue);
        // 实现cid%2+1逻辑, 返回计算后得到的真实表名称的数字: 1或者2
        BigInteger resB = (shardingValueB.mod(new BigInteger("2"))).add(new BigInteger("1"));
        // 拼接数据源名称: m_1或者m_2
        String key = "m" + resB;
        // 判断数据源名称是否合法并返回
        if(availableTargetNames.contains(key)){
            return key;
        }
        // m1, m2
        throw new UnsupportedOperationException("route "+ key +" is not supported ,please check your config");
    }
}
